package com.swak.reactivex.context;

import java.util.List;
import java.util.Set;

import com.swak.OS;
import com.swak.utils.Sets;
import com.swak.utils.StringUtils;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * 端点集合
 * 
 * @author lifeng
 * @date 2020年5月11日 下午4:56:42
 */
@Getter
@Setter
@Accessors(chain = true)
public class EndPoints {

	public static EndPoints ME = new EndPoints();

	public static EndPoints me() {
		return ME;
	}

	/**
	 * 私有创建
	 */
	private EndPoints() {
		this.endPoints = Sets.newOrderSet();
		this.host = OS.ip();
	}

	/**
	 * 地址
	 */
	private String host;

	/**
	 * 所有发布的端口
	 */
	private Set<EndPoint> endPoints;

	/**
	 * 设置启动的端点
	 * 
	 * @param endPoints
	 * @return
	 */
	public EndPoints setEndPoint(EndPoint endPoint) {
		if (StringUtils.isBlank(endPoint.getHost())) {
			endPoint.setHost(host);
		}
		this.endPoints.add(endPoint);
		return this;
	}

	/**
	 * 设置启动的端点
	 * 
	 * @param endPoints
	 * @return
	 */
	public EndPoints setEndPoints(List<EndPoint> endPoints) {
		for (EndPoint endPoint : endPoints) {
			if (StringUtils.isBlank(endPoint.getHost())) {
				endPoint.setHost(host);
			}
		}
		this.endPoints.addAll(endPoints);
		return this;
	}

	public EndPoint getEndPoint(com.swak.annotation.Server scheme) {
		for (EndPoint endPoint : endPoints) {
			if (endPoint.scheme == scheme) {
				return endPoint;
			}
		}
		return null;
	}

	/**
	 * 格式化输出
	 */
	@Override
	public String toString() {
		StringBuilder ports = new StringBuilder();
		int i = 0;
		for (EndPoint point : endPoints) {
			ports.append(point.getScheme()).append(":").append(point.getPort());
			if (point.getParallel() > 0) {
				ports.append("[").append(point.getParallel()).append("]");
			}
			if (i++ != endPoints.size() - 1) {
				ports.append(", ");
			}
		}
		return ports.length() <= 0 ? StringUtils.EMPTY : StringUtils.format("Host: %s, %s", host, ports.toString());
	}

	/**
	 * 具体的端口
	 * 
	 * @author lifeng
	 * @date 2020年5月11日 下午5:00:16
	 */
	@Getter
	@Setter
	@Accessors(chain = true)
	public static class EndPoint {

		/**
		 * 协议
		 */
		private com.swak.annotation.Server scheme;

		/**
		 * 地址
		 */
		private String host;

		/**
		 * 端口
		 */
		private int port;

		/**
		 * 并行数
		 */
		private int parallel;

		/**
		 * 格式化输出
		 */
		@Override
		public String toString() {
			return StringUtils.format("%s://%s:%s/", scheme, host, port);
		}

		@Override
		public int hashCode() {
			return toString().hashCode();
		}

		@Override
		public boolean equals(Object obj) {
			if (obj == null || !(obj instanceof EndPoint)) {
				return false;
			}
			return ((EndPoint) obj).toString().equals(this.toString());
		}
	}
}